今天會來實作OPA的配置,由於之前有透過rancher管理了k8s環境,所以就可以從rancher的套件管理項目中找到OPA的套件,透過rancher安裝好OPA後可以在rancher的介面上操作OPA的yaml如下
預設rancher提供了兩個範例(repo來源限制、需要label才能佈署),也可以自己在constraints和template中撰寫需要的規則和要受影響的對象,我這邊額外做一個image不可以為latest的範例來demo OPA
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
annotations:
meta.helm.sh/release-name: rancher-gatekeeper
meta.helm.sh/release-namespace: cattle-gatekeeper-system
generation: 5
labels:
app.kubernetes.io/managed-by: Helm
name: imagetag
spec:
crd:
spec:
names:
kind: k8sallowedimagetag
validation:
openAPIV3Schema:
properties:
repos:
items:
type: string
type: array
targets:
- rego: |
package k8sblocklatesttag
violation[{"msg": msg, "details": {}}]{
input.review.object.kind == "Pod"
imagename := input.review.object.spec.containers[_].image
endswith(imagename,"latest")
msg := "Images with tag the tag \"latest\" is prohibited"
}
target: admission.k8s.gatekeeper.sh
配置完成後佈署服務會發現pod會失敗(一直是0個起不來)
describe deployment後就會發現被webhook阻擋並且原因是image tag不可以為latest的訊息唷(Images with tag the tag "latest" is prohibited),其實主要就是要在rego內撰寫要怎麼檢核yaml,通常常用的規則會是repo來源限制、image tag 和禁止latest、不允許privileged權限,撰寫上其實網路上也有許多範例可以參考。